package com.wp.targetOffer;

import java.util.Arrays;
import java.util.Stack;

/**
 * Created by 王萍 on 2017/8/13 0013.
 */
public class 包含min函数的栈 {

    public static void main(String[] args) {
        MinStack stack = new MinStack();
        stack.push(6);
        stack.push(7);
        stack.push(5);
//        stack.push(4);
        System.out.println(stack.min());
    }

    private static class MinStack {

        private int size;//记录当前stack的大小
        private int min = Integer.MAX_VALUE;//用来记录当前的最小值，最初将min赋一个最大值。
        Stack<Integer> minStack = new Stack<>();//用来存放不同elements时的不同min值。

        private Integer[] elements = new Integer[10];

        public void push(int node) {
            ensureCapacity(size + 1);//在push时确保elements的长度够长，以防止越界。
            elements[size++] = node;

            //为的到min值进行的相关操作
            if (node < min) {//利用当前记录的值，与push进来的值进行比较。选取最小值
                minStack.push(node);
                min = node;//更新最小值
            } else minStack.push(min);
        }

        public void pop() {
            if (size != 0) {
                elements[--size] = null;
                size--;

                //pop一个元素时，将pop之前对应的min值删掉。重新获取当前的min值
                minStack.pop();
                min = minStack.peek();//更新最小值
            }
        }

        public int top() {
            if (size != 0) {
                return elements[--size];
            }
            return Integer.parseInt(null);
        }

        public int min() {
            return min;
        }

        private void ensureCapacity(int size) {
            int len = elements.length;
            if (size > len) {
                int newLen = (len * 3) / 2 + 1;
                elements = Arrays.copyOf(elements, newLen);

//                Integer newArray[] = new Integer[newLen];
                //len指的是需要复制的元素的长度。
//                System.arraycopy(elements,0,newArray,0,len);
            }
        }
    }
}
